package nl.fontys.sofa.limo.view.custom.table; import java.util.ArrayList; import java.util.List; import java.util.Map; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.chart.BarChart; import javafx.scene.chart.PieChart; import javafx.scene.chart.XYChart; import javax.swing.event.TableModelListener; import nl.fontys.sofa.limo.simulation.result.DataEntry; import nl.fontys.sofa.limo.view.graphs.AbstractLimoTableModel; import nl.fontys.sofa.limo.view.util.LIMOResourceBundle; /** * * @author Dominik Kaisers {@literal <d.kaisers@student.fontys.nl>} */ public class DataEntryTableModel extends AbstractLimoTableModel { public static final String COSTS_ID = "COSTS"; public static final String LEAD_TIMES_ID = "LEAD_TIMES"; public static final String EXTRA_COSTS_ID = "EXTRA_COSTS"; public static final String DELAYS_ID = "DELAYS"; public static String CO2_ID = "CO2"; private final List<String> names; private final List<DataEntry> costs; private final List<DataEntry> leadTimes; private final List<DataEntry> extraCosts; private final List<DataEntry> delays; private final List<DataEntry> co2Values; private final List<Boolean> enabled; private boolean onlyOneEnabled = false; public DataEntryTableModel(List<String> names, Map<String, List<DataEntry>> dataEntries) { this.names = names; this.costs = dataEntries.get(COSTS_ID); this.leadTimes = dataEntries.get(LEAD_TIMES_ID); this.extraCosts = dataEntries.get(EXTRA_COSTS_ID); this.delays = dataEntries.get(DELAYS_ID); this.co2Values = dataEntries.get(CO2_ID); this.enabled = new ArrayList(); enabled.add(Boolean.FALSE); for (int i = 0; i < 15; i++) { enabled.add(true); } } public void setOnlyOneEnabled(boolean onlyOneEnabled) { this.onlyOneEnabled = onlyOneEnabled; } @Override public int getRowCount() { return this.names.size() + 1; } @Override public int getColumnCount() { return 16; } @Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { if (isCellEditable(rowIndex, columnIndex) && rowIndex == 0) { if ((Boolean) aValue == true && this.onlyOneEnabled) { for (int i = 0; i < enabled.size(); i++) { enabled.set(i, Boolean.FALSE); } } enabled.set(columnIndex, Boolean.valueOf(aValue.toString())); fireTableDataChanged(); } } @Override public Object getValueAt(int rowIndex, int columnIndex) { if (rowIndex == 0) { if (columnIndex == 0) { return "Enabled:"; } return enabled.get(columnIndex); } rowIndex = rowIndex - 1; switch (columnIndex) { case 0: return names.get(rowIndex); case 1: return costs.get(rowIndex).getMin(); case 2: return costs.get(rowIndex).getAvg(); case 3: return costs.get(rowIndex).getMax(); case 4: return leadTimes.get(rowIndex).getMin(); case 5: return leadTimes.get(rowIndex).getAvg(); case 6: return leadTimes.get(rowIndex).getMax(); case 7: return extraCosts.get(rowIndex).getMin(); case 8: return extraCosts.get(rowIndex).getAvg(); case 9: return extraCosts.get(rowIndex).getMax(); case 10: return delays.get(rowIndex).getMin(); case 11: return delays.get(rowIndex).getAvg(); case 12: return delays.get(rowIndex).getMax(); case 13: return co2Values.get(rowIndex).getMin(); case 14: return co2Values.get(rowIndex).getAvg(); case 15: return co2Values.get(rowIndex).getMax(); default: return ""; } } @Override public Class<?> getColumnClass(int columnIndex) { if (columnIndex == 14) { return Boolean.class; } return super.getColumnClass(columnIndex); //To change body of generated methods, choose Tools | Templates. } @Override public boolean isCellEditable(int rowIndex, int columnIndex) { return rowIndex == 0 && columnIndex != 0; } @Override public String getColumnName(int column) { switch (column) { case 0: return LIMOResourceBundle.getString("NAME"); case 1: return LIMOResourceBundle.getString("COSTS MIN"); case 2: return LIMOResourceBundle.getString("COSTS AVG"); case 3: return LIMOResourceBundle.getString("COSTS MAX"); case 4: return LIMOResourceBundle.getString("LEAD TIMES MIN"); case 5: return LIMOResourceBundle.getString("LEAD TIMES AVG"); case 6: return LIMOResourceBundle.getString("LEAD TIMES MAX"); case 7: return LIMOResourceBundle.getString("EXTRA COSTS MIN"); case 8: return LIMOResourceBundle.getString("EXTRA COSTS AVG"); case 9: return LIMOResourceBundle.getString("EXTRA COSTS MAX"); case 10: return LIMOResourceBundle.getString("DELAYS MIN"); case 11: return LIMOResourceBundle.getString("DELAYS AVG"); case 12: return LIMOResourceBundle.getString("DELAYS MAX"); case 13: return LIMOResourceBundle.getString("CO2 MIN"); case 14: return LIMOResourceBundle.getString("CO2 AVG"); case 15: return LIMOResourceBundle.getString("CO2 MAX"); default: return ""; } } @Override protected ObservableList<XYChart.Series> getBarChartData() { ObservableList<XYChart.Series> bcData = FXCollections.<BarChart.Series>observableArrayList(); List<Integer> activeIndexes = new ArrayList<>(); for (int i = 1; i < enabled.size(); i++) { if (enabled.get(i) == true) { activeIndexes.add(i); } } activeIndexes.stream().map((activeIndexe) -> { XYChart.Series serie = new XYChart.Series(); ObservableList<XYChart.Data> dataSet = FXCollections.<BarChart.Data>observableArrayList(); for (int j = 1; j < getRowCount(); j++) { XYChart.Data data = new XYChart.Data(); data.setXValue(names.get(j - 1)); data.setYValue(getValueAt(j, activeIndexe)); dataSet.add(data); } serie.setData(dataSet); serie.setName(getColumnName(activeIndexe)); return serie; }).forEach((serie) -> { bcData.add(serie); }); return bcData; } @Override protected ObservableList<XYChart.Series> getLineChartData() { ObservableList<XYChart.Series> bcData = FXCollections.<BarChart.Series>observableArrayList(); List<Integer> activeIndexes = new ArrayList<>(); for (int i = 1; i < enabled.size(); i++) { if (enabled.get(i) == true) { activeIndexes.add(i); } } for (int i = 0; i < activeIndexes.size(); i++) { XYChart.Series serie = new XYChart.Series(); ObservableList<XYChart.Data> dataSet = FXCollections.<BarChart.Data>observableArrayList(); Double val = 0.0; for (int j = 1; j < getRowCount(); j++) { XYChart.Data data = new XYChart.Data(); data.setXValue(names.get(j - 1)); Object valTemp = getValueAt(j, activeIndexes.get(i)); if (valTemp instanceof Number) { Number n = (Number) valTemp; val += n.doubleValue(); data.setYValue(val); } else { data.setYValue(getValueAt(j, i)); } dataSet.add(data); } serie.setData(dataSet); serie.setName(getColumnName(activeIndexes.get(i))); bcData.add(serie); } return bcData; } @Override protected ObservableList<XYChart.Series> getAreaChartData() { return getLineChartData(); } public void removeAllListeners() { for (TableModelListener tableModelListener : this.getTableModelListeners()) { this.removeTableModelListener(tableModelListener); } } @Override public ObservableList<PieChart.Data> getPieChartData() { ObservableList<PieChart.Data> result = FXCollections.<PieChart.Data>observableArrayList(); int activeIndex = -1; for (int i = 1; i < enabled.size(); i++) { if (enabled.get(i) == true && activeIndex < 0) { activeIndex = i; } else { enabled.set(i, Boolean.FALSE); } } fireTableRowsUpdated(0, 0); for (int i = 0; i < names.size(); i++) { Object val = getValueAt(i + 1, activeIndex); if (val instanceof Double) { PieChart.Data data = new PieChart.Data(names.get(i), (Double) val); result.add(data); } } return result; } }